/**********************************************************************
* Filename: Equipa.java
* Created: 2012/04/23
* @author Fernando Brito e Abreu
**********************************************************************/
package org.quasar.copaPaises.businessLayer;

import java.util.Set;
import java.util.HashSet;

public class Equipa implements Comparable<Equipa>
{
	public static Set<Equipa> allInstances = new HashSet<Equipa>();
	
	private Jogo jogo;
	private Pais seleccao;
	
	/**********************************************************************
	* Default constructor
	**********************************************************************/
	public Equipa()
	{
		allInstances.add(this);
	}
	
	/**********************************************************************
	* Parameterized constructor
	* @param jogo the jogo to initialize
	* @param seleccao the seleccao to initialize
	**********************************************************************/
	public Equipa(Jogo jogo, Pais seleccao)
	{
		this.jogo = jogo;
		this.seleccao = seleccao;
		allInstances.add(this);
	}
	
	/**********************************************************************
	* ASSOCIATIVE2MEMBER getter for Equipa[*] <-> Jogo[1]
	* @return the jogo of the equipa
	**********************************************************************/
	public Jogo jogo()
	{
		return jogo;
	}
	
	/**********************************************************************
	* ASSOCIATIVE2MEMBER setter for Equipa[*] <-> Jogo[1]
	* @param jogo the jogo to set
	**********************************************************************/
	public void setJogo(Jogo jogo)
	{
		this.jogo = jogo;
	}
	
	/**********************************************************************
	* ASSOCIATIVE2MEMBER getter for Equipa[*] <-> Pais[1]
	* @return the seleccao of the equipa
	**********************************************************************/
	public Pais seleccao()
	{
		return seleccao;
	}
	
	/**********************************************************************
	* ASSOCIATIVE2MEMBER setter for Equipa[*] <-> Pais[1]
	* @param seleccao the seleccao to set
	**********************************************************************/
	public void setSeleccao(Pais seleccao)
	{
		this.seleccao = seleccao;
	}
	
	/**********************************************************************
	* MEMBER2ASSOCIATIVE getter for Equipa[*] <-> Membro[11..*]
	* @return the membro of the equipa
	**********************************************************************/
	public Set<Membro> membro()
	{
		Set<Membro> result = new HashSet<Membro>();
		for (Membro x : Membro.allInstances)
			if (x.equipa()  ==  this)
				result.add(x);
		return result;
	}
	
	/**********************************************************************
	* MEMBER2ASSOCIATIVE setter for Equipa[*] <-> Membro[11..*]
	* @param membro the membro to set
	**********************************************************************/
	public void setMembro(Set<Membro> membro)
	{
		for (Membro x : membro)
			x.setEquipa(this);
	}
	
	/**********************************************************************
	* MEMBER2MEMBER getter for Equipa[*] <-> Jogador[11..*]
	* @return the jogador of the equipa
	**********************************************************************/
	public Set<Jogador> jogador()
	{
		Set<Jogador> result = new HashSet<Jogador>();
		for (Membro x : Membro.allInstances)
			if (x.equipa()  ==  this)
				result.add(x.jogador());
		return result;
	}
	
	/**********************************************************************
	* MEMBER2MEMBER setter for Equipa[*] <-> Jogador[11..*]
	* @param jogador the jogador to set
	**********************************************************************/
	public void setJogador(Set<Jogador> jogador)
	{
		for (Jogador t : jogador)
			for (Membro x: Membro.allInstances)
				if (x.equipa() == this)
					x.setJogador(t);
	}
	
	/**********************************************************************
	* User-defined operation specified in SOIL/OCL
	**********************************************************************/
	/**public void criaFichaJogoFalsa()
	{
		//	TODO
		//	jogadores := self.seleccao.participacao->select(p : Participacao | (p.participado = self.jogo.grupo.campeonato))->collectNested($e : Participacao | $e.plantel)->flatten->asSet;
		//	 for j in jogadores do if (self.membro->size < 14) then m := new Membro between (j,self);
		//	 if (self.membro->size <= 11) then m.minuto_entrada := 1;
		//	 m.minuto_saida := 90 else m.minuto_entrada := (self.membro->size * 5);
		//	 m.minuto_saida := 90;
		//	 self.membro->asSequence->at((self.membro->size - 5)).minuto_saida := m.minuto_entrada end;
		//	 if (j.data_nascimento.isLeap() and ((j.data_nascimento.month = 3) or (j.data_nascimento.month = 9))) then cartaoA := new Cartao;
		//	 cartaoA.inicializa(TipoCartao::Amarelo, (j.data_nascimento.day + j.data_nascimento.month));
		//	 insert (m,cartaoA) into Membro_Cartao end;
		//	 if ((j.data_nascimento.isLeap() and (j.data_nascimento.month = 3)) and (j.data_nascimento.day > 15)) then cartaoV := new Cartao;
		//	 cartaoV.inicializa(TipoCartao::Vermelho, ((j.data_nascimento.day * 2) + j.data_nascimento.month));
		//	 m.minuto_saida := cartaoV.minuto;
		//	 insert (m,cartaoV) into Membro_Cartao end;
		//	 if (((j.data_nascimento.month > 7) and (j.data_nascimento.day < 15)) and (j.posicao = PosicaoJogador::Avancado)) then golo := new Golo;
		//	 golo.inicializa(if j.data_nascimento.isLeap() then (j.data_nascimento.month * 7) else j.data_nascimento.day endif);
		//	 insert (m,golo) into Membro_Golo end end end;
	}*/
	
	/* (non-Javadoc)
	* @see java.lang.Object#toString()
	*/
	@Override
	/**********************************************************************
	* Object serializer
	**********************************************************************/
	public String toString()
	{
		return "Equipa [jogo=" + jogo + ", seleccao=" + seleccao + "]\n";
	}

	@Override
	public int compareTo(Equipa arg0) {
	return this.seleccao().compareTo(arg0.seleccao());
	}
	
}
